package leetcode.code1078;

import java.util.ArrayList;
import java.util.List;

import leetcode.IDebug;
import leetcode.helper.HelpDebug;

/**
 * 1078. Bigram 分词 Java 100%
 */
public class Solution implements IDebug {

	public String[] findOcurrences(String text, String first, String second) {
		List<String> list = new ArrayList<>();
		boolean isSame = first.equals(second);
		char[] f = first.toCharArray();// first
		char[] s = second.toCharArray();// second
		char[] t = text.toCharArray();// text
		int pf = 0, ps = 0, pt = 0;// 分别指向first second text
		int lenf = first.length(), lens = second.length(), lent = text.length();
		boolean findfirst = false;
		int startOfSecond = 0;// 第二个词的开始位置
		while (pt < lent) {
			char ct = t[pt++];
			if (ct == ' ') {// text一个词结束
				if (!findfirst) {
					if (pf == lenf) {// 恰好，第一个单词匹配
						findfirst = true;// 第一个词找到了
						startOfSecond = pt;// 记录第二个词的开始位置。
					} else {
						pf = 0;// text里的词短，第一个词没完全匹配，重新来匹配第一个。
					}
				} else {
					if (ps == lens) {// 恰好，第二个单词匹配
						if (pt < lent) {// 后边能有第三个词
							String str = this.third(t, pt);
							list.add(str);
						} else {// 后面没词了
							break;
						}
						if (isSame) {// first second 两个词是否一致
							findfirst = true;// 当前第二个词当第一个用
							startOfSecond = pt;// 从pt的位置找第二个词
						} else {
							findfirst = false;// 从pt开始重新找第一个词
						}
						pf = 0;// 两种情况要么从0开始，要么和pf没关系。
						ps = 0;// 两种情况第二个词都要从头找
					} else {// 第一个词儿对上了，紧接的第二个词不对
						findfirst = false;
						pt = startOfSecond;// 看看第二个词能不能做第一个次
						pf = 0;// 重新
						ps = 0;
					}
				}
			} else {
				if (!findfirst) {// 匹配第一个词
					if (pf < lenf) {
						char cf = f[pf];
						if (cf == ct) {// 第一个词字母匹配
							pf++;
						}
					} else {
						// text当前词儿长，没配上，这个词都不对，跳过去
						while (pt < lent && t[pt] != ' ') {
							pt++;
						}
						pt++;// 跳过空格
						pf = 0;// 重新找第一个
					}
				} else {
					if (ps < lens) {
						char cs = s[ps];
						if (cs == ct) {
							ps++;
						} else {
							pt = startOfSecond;
							findfirst = false;
							pf = 0;
							ps = 0;
						}
					} else {// 第一个词匹配，紧接着text的词比second长，没配上
						pt = startOfSecond;// 从刚刚第二个词的位置开始，看看能不能当第一个词用
						findfirst = false;
						pf = 0;
						ps = 0;
					}
				}
			}
		}
		String[] ans = new String[list.size()];
		for (int i = 0; i < list.size(); i++) {
			ans[i] = list.get(i);
		}
		return ans;
	}

	// 取第三个词
	private String third(char[] chars, int r) {
		int p = r;
		int count = 0;
		while (p < chars.length && chars[p] != ' ') {
			count++;
			p++;
		}
		return new String(chars, r, count);
	}

	@Override
	public void debug1() {
		String[] r = this.findOcurrences("we will we will rock you", "we", "will");
		String[] e = HelpDebug.str2array2("[\"we\",\"rock\"]");
		HelpDebug.compare(e, r);
	}

	@Override
	public void debug2() {
		String[] r = this.findOcurrences("alice is a good girl she is a good student", "a", "good");
		String[] e = HelpDebug.str2array2("[\"girl\",\"student\"]");
		HelpDebug.compare(e, r);
	}

	@Override
	public void debug3() {
		String[] r = this.findOcurrences("we we we we", "we", "we");
		String[] e = HelpDebug.str2array2("[\"we\",\"we\"]");
		HelpDebug.compare(e, r);
	}

	@Override
	public void debug4() {
		String[] r = this.findOcurrences("a a a a", "a", "a");
		String[] e = HelpDebug.str2array2("[\"a\",\"a\"]");
		HelpDebug.compare(e, r);
	}

	public void debug5() {
		String[] r = this.findOcurrences("a aa a a", "aa", "a");
		String[] e = HelpDebug.str2array2("[\"a\"]");
		HelpDebug.compare(e, r);
	}

	public void debug6() {
		String[] r = this.findOcurrences("aa a aa a", "a", "aa");
		String[] e = HelpDebug.str2array2("[\"aa\"]");
		HelpDebug.compare(e, r);
	}

	public void debug7() {
		String[] r = this.findOcurrences(
				"obo jvezipre obo jnvavldde jvezipre jvezipre jnvavldde jvezipre jvezipre jvezipre y jnvavldde jnvavldde obo jnvavldde jnvavldde obo jnvavldde jnvavldde jvezipre",
				"jnvavldde", "y");
		String[] e = HelpDebug.str2array2("[]");
		HelpDebug.compare(e, r);
	}

	public void debug8() {
		String[] r = this.findOcurrences("we we we we will rock you", "we", "we");
		String[] e = HelpDebug.str2array2("[\"we\",\"we\",\"will\"]");
		HelpDebug.compare(e, r);
	}

	public static void main(String[] args) {
		Solution so = new Solution();
		so.debug8();
		so.debug7();
		so.debug6();
		so.debug5();
		so.debug4();
		so.debug3();
		so.debug2();
		so.debug1();

	}

}
